package A2014;

/*
    观察这个数列：
    1 3 0 2 -1 1 -2 ...
    这个数列中后一项总是比前一项增加2或者减少3。
    栋栋对这种数列很好奇，他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减少b的整数数列可能有多少种呢？
【数据格式】
    输入的第一行包含四个整数 n s a b，含义如前面说述。
    输出一行，包含一个整数，表示满足条件的方案数。由于这个数很大，请输出方案数除以100000007的余数。
例如，输入：
4 10 2 3
程序应该输出：
2
【样例说明】
这两个数列分别是2 4 1 3和7 4 1 -2。
【数据规模与约定】
对于10%的数据，1<=n<=5，0<=s<=5，1<=a,b<=5；
对于30%的数据，1<=n<=30，0<=s<=30，1<=a,b<=30；
对于50%的数据，1<=n<=50，0<=s<=50，1<=a,b<=50；
对于70%的数据，1<=n<=100，0<=s<=500，1<=a, b<=50；
对于100%的数据，1<=n<=1000，-1,000,000,000<=s<=1,000,000,000，1<=a, b<=1,000,000。
资源约定：
峰值内存消耗（含虚拟机） < 256M
CPU消耗  < 2000ms
*/
import java.util.Scanner;
public class _10_波动数列 {
 
  private static int n;
  private static long s;
  private static long a;
  private static long b;
  private static long ans;
 private static long MOD=100000007;
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    n = sc.nextInt();
    s = sc.nextLong();
    a = sc.nextLong();
    b = sc.nextLong();
    int t = n * (n - 1) / 2;
    long x1=(s-a*t),x2=(s+b*t);
    for(int i=0;i<=t;i++) {   	
    	long nx =s-a*i+b*(t-i);//
    	if(nx%n==0&&nx<=x2&&nx>=x1) {
    		dfs(nx/n,1,nx/n);
    	}
    }
    System.out.println(ans);
  }
private static void dfs(long x, int cnt, long sum) {
	if(cnt==n) {
		if(sum==s) {
			ans=(ans+1)%MOD;
		}
		return;
	}
	dfs(x+a,cnt+1,sum+x+a);
	dfs(x-b,cnt+1,sum+x-b);
}
}